/**
 *  对象深拷贝
 * @param {*} obj
 */
export function deepClone(obj) {
  const cloneObj = Array.isArray(obj) ? [] : {};
  if (obj && typeof obj === "object") {
    for (var key in obj) {
      if (Object.prototype.hasOwnProperty.call(obj, key)) {
        if (obj[key] && typeof obj[key] === "object") {
          cloneObj[key] = deepClone(obj[key]);
        } else {
          cloneObj[key] = obj[key];
        }
      }
    }
  }
  return cloneObj;
}
/**
 * 格式化日期返回例：2022-03-03 15:00:00
 * @param {*} timestamp  时间戳,不传即默认当前时间
 */
export function timestampToYYYYMMDDHHMMSS(timestamp) {
  let date;
  if (timestamp) {
    date = new Date(timestamp);
  } else {
    date = new Date();
  }
  // 时间戳为10位需*1000，时间戳为13位的话不需乘1000
  let Y = date.getFullYear() + "-";
  let M =
    (date.getMonth() + 1 < 10
      ? "0" + (date.getMonth() + 1)
      : date.getMonth() + 1) + "-";
  let D = (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " ";
  let h =
    (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) + ":";
  let m =
    (date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes()) +
    ":";
  let s = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
  return Y + M + D + h + m + s;
}
/**
 * 格式化日期返回例：2022-03-03
 * @param {*} timestamp  时间戳,不传即默认当前时间
 */
export function timestampToYYYYMMDD(timestamp) {
  let date;
  if (timestamp) {
    date = new Date(timestamp);
  } else {
    date = new Date();
  }
  // 时间戳为10位需*1000，时间戳为13位的话不需乘1000
  let Y = date.getFullYear() + "-";
  let M =
    (date.getMonth() + 1 < 10
      ? "0" + (date.getMonth() + 1)
      : date.getMonth() + 1) + "-";
  let D = (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " ";
  return Y + M + D;
}

/**
 * 根据日期字符串获取星期几
 * @param dateString 日期字符串（如：2022-05-02）
 * @returns 周一、周二...
 */
export function getWeek(dateString) {
  var dateArray = dateString.split("-");
  let date = new Date(dateArray[0], parseInt(dateArray[1] - 1), dateArray[2]);
  return "周" + "日一二三四五六".charAt(date.getDay());
}

/**
 * 日期排序
 * @param {*} data 有日期字段的数组数据
 * @param {*} p 日期字段字段名
 * @param {*} order 排序方式  desc降序，asc升序,默认降序
 * @returns 排序后
 */
export function orderByDate(data, p, order) {
  if (!order) {
    order = "desc";
  }
  for (let i = 0; i < data.length - 1; i++) {
    for (let j = 0; j < data.length - 1 - i; j++) {
      if (order === "desc") {
        if (Date.parse(data[j][p]) < Date.parse(data[j + 1][p])) {
          let temp = data[j];
          data[j] = data[j + 1];
          data[j + 1] = temp;
        }
      } else if (order === "asc") {
        if (Date.parse(data[j][p]) > Date.parse(data[j + 1][p])) {
          let temp = data[j];
          data[j] = data[j + 1];
          data[j + 1] = temp;
        }
      }
    }
  }
  return data;
}
/**
 * 计算两个时间戳相差
 * @param {*} subtraction 减数
 * @param {*} minuend 被减数
 * @returns res 返回res.day == 相差的天数，res.hour == 余后的相差小时，res.min == 余后的相差分
 */
export function getTimeDiffer(subtraction, minuend) {
  let res = {};
  let total = (minuend - subtraction) / 1000;
  let day = parseInt(total / (24 * 60 * 60)); // 计算整数天数
  let afterDay = total - day * 24 * 60 * 60; // 取得算出天数后剩余的秒数
  let hour = parseInt(afterDay / (60 * 60)); // 计算整数小时数
  let afterHour = total - day * 24 * 60 * 60 - hour * 60 * 60; // 取得算出小时数后剩余的秒数
  let min = parseInt(afterHour / 60); // 计算整数分
  let afterMin = total - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60; // 取得算出分后剩余的秒数
  res.day = day; // 相差天数
  res.afterDay = afterDay;
  res.hour = hour; // 相差小时
  res.afterHour = afterHour;
  res.min = min; // 相差分
  res.afterMin = afterMin;
  return res;
}

/**
 * 随机生成字符串
 * @param length 字符串的长度
 * @param chats 可选字符串区间（只会生成传入的字符串中的字符）
 * @return string 生成的字符串
 */
export function randomString(length, chats) {
  if (!length) length = 1;
  if (!chats) chats = "0123456789qwertyuioplkjhgfdsazxcvbnm";
  let str = "";
  for (let i = 0; i < length; i++) {
    let num = randomNumber(0, chats.length - 1);
    str += chats[num];
  }
  return str;
}

/**
 * 随机生成数字
 *
 * 示例：生成长度为 12 的随机数：randomNumber(12)
 * 示例：生成 3~23 之间的随机数：randomNumber(3, 23)
 *
 * @param1 最小值 | 长度
 * @param2 最大值
 * @return int 生成后的数字
 */
export function randomNumber() {
  // 生成 最小值 到 最大值 区间的随机数
  const random = (min, max) => {
    return Math.floor(Math.random() * (max - min + 1) + min);
  };
  if (arguments.length === 1) {
    let [length] = arguments;
    // 生成指定长度的随机数字，首位一定不是 0
    let nums = [...Array(length).keys()].map((i) =>
      i > 0 ? random(0, 9) : random(1, 9)
    );
    return parseInt(nums.join(""));
  } else if (arguments.length >= 2) {
    let [min, max] = arguments;
    return random(min, max);
  } else {
    return Number.NaN;
  }
}

/**
 * 下划线转驼峰
 * @param string
 * @returns {*}
 */
export function underLine2CamelCase(string) {
  return string.replace(/_([a-z])/g, function (all, letter) {
    return letter.toUpperCase();
  });
}

/**
 * 过滤对象中为空的属性
 * @param obj
 * @returns {*}
 */
export function filterObj(obj) {
  if (!(typeof obj === "object")) {
    return;
  }

  for (var key in obj) {
    // eslint-disable-next-line no-prototype-builtins
    if (
      // eslint-disable-next-line no-prototype-builtins
      obj.hasOwnProperty(key) &&
      (obj[key] == null || obj[key] === undefined || obj[key] === "")
    ) {
      delete obj[key];
    }
  }
  return obj;
}

/**
 * 深度克隆对象、数组
 * @param obj 被克隆的对象
 * @return 克隆后的对象
 */
export function cloneObject(obj) {
  return JSON.parse(JSON.stringify(obj));
}

/**
 * 根据当前时间返回问候语
 * @returns
 */
export function timeFix() {
  const time = new Date();
  const hour = time.getHours();
  return hour < 6
    ? "凌晨好"
    : hour < 9
      ? "早上好"
      : hour < 12
        ? "上午好"
        : hour < 15
          ? "中午好"
          : hour < 18
            ? "下午好"
            : "晚上好";
}

/**
 * 随机产生一段问候语
 * @returns
 */
export function welcome() {
  const arr = [
    "休息一会儿吧",
    "准备吃什么呢?",
    "要不要打一把王者荣耀",
    "我猜你可能累了",
    "最近好吗?",
    "去发现页看看朋友们的卡片吧!",
    "可以在消息页和朋友聊天哦~~~",
    "是不是有新朋友申请添加你为好友了",
  ];
  let index = Math.floor(Math.random() * arr.length);
  return arr[index];
}


/**
 * 清空数据
 * @param {*} model
 */
export function cleanObject(model) {
  Object.keys(model).forEach((key) => {
    if (typeof model[key] === "string") {
      model[key] = undefined;
    } else if (typeof model[key] === "number") {
      model[key] = 0;
    } else {
      model[key] = undefined;
    }
  });
}
